package uoc.ei.practica;

import uoc.ei.tads.Iterador;

/** 
 * Definición del TAD de gestión del campionato de apalabrados
 */
public interface ScrabbleManager {
	
	public static int MAX_LETTERS=29;
	public static int MAX_CARDS_USER = 5;
	public static int MAX_CARDS_GAME = 100;
	
	/**
	 * método que crea un nuevo campeonato con un nombre que lo identifica
	 * unívocamente.
	 * @param name nombre del campeonato a crear
	 * @throws EIException se lanza una excepción en el caso que el nombre
	 * del campeonato ya exista.
	 */
	public void addChampionShip(String championShipId) throws EIException;

	/**
	 * método que proporciona un iterador con los campeonatos del sistema.
	 * @return retorna el iterador
	 * @throws EIException lanza una excepción en el caso que no exista ningún 
	 * campeonato
	 */
	public Iterador<ChampionShip> championShips() throws EIException;
	
	/**
	 * método que añade una palabra en el sistema para un campeonato.
	 * En el caso que el campeonato no exista se deberá lanzar una excepción.
	 * En el caso que la palabra exista no se deberá hacer nada. En cualquier caso,
	 * no existirán palabras repetidas en el sistema.
	 * @param word la palabra a añadir
	 * @param chanpionShipId identificador del campeonato
	 * @throws EIException la excepción a lanzar.
	 */
	public void addWord(String championShipId, String word) throws EIException;
	
	
	/**
	 * método que proporciona un iterador de todas las palabras del 
	 * diccionario de un campeonato
	 * @return iterador con las palabras
	 * @throws EIException lanza una excepción en el caso que no exista palabras 
	 * o el campeonato no exista
	 */
	public Iterador<Word> words(String championShipId) throws EIException;
	
	
	/**
	 * método que añade una letra con una puntuación en un campeonato.
	 * @param championShipId identificador del campeonato.
	 * @param letter la letra
	 * @param points número de puntos
	 * @param total número de fichas a generar.
	 * @throws EIException lanza una excepción en el caso que la letra
	 * ya exita en el sistema o que se añadan más letras que las 
	 * estimadas (MAX_LETTERS).
	 */
	public void addLetter(String championShipId, String letter, int points, int total) throws EIException;
	
	/**
	 * método que retorna un iterador de las letras que existen en un campeonato
	 * @param championShipId identificador del campeonato
	 * @return iterador con las letras
	 * @throws EIException la excepción a lanzar 
	 */
	public Iterador<Letter> letters(String championShipId) throws EIException;
	
	/**
	 * método que añade una partida sobre un campeonato.
	 * @param championShipId identificador del campeonato a añadir
	 * @param gameId identificador de la partida 
	 * @param player1 nombre del primer jugador
	 * @param player2 nombre del segundo jugador
	 * @throws EIException lanza una excepción en el caso que no exista
	 * el campionato o que ya exista una partida con este nombre
	 */
	public void addGame(String championShipId, String gameId, String player1, String player2) throws EIException;
	
	/**
	 * método que proporciona las partidas de un campeonato
	 * @param championShipId identificador del campeonato
	 * @return retorna les partides de un campeonato
	 * @throws EIException lanza una excepción en el caso 
	 * que no exista el campeonato o no existan partidas.
	 */
	public Iterador<Game> games(String championShipId) throws EIException;
	
	/**
	 * método que añade una ficha a una partida de un campeonato
	 * @param championShip identificador del campeonato
	 * @param gameId identificador de la partida
	 * @param letter letra a añadir
	 * @throws EIException lanza una excepción en el caso que el campeonato, 
	 * la partida o la letra no sean válidas; 
	 * o en el caso que la partida ya haya empezado. 
	 */
	public void addCard(String championShip, String gameId, String letter) throws EIException;


	/**
	 * método que inicializa una partida de un campeonato 
	 * y asigna a cada jugador sus fichas iniciales. 
	 * @param championShipId identificador del campeonato
	 * @param gameId identificador de la partida
	 * @throws EIException lanza una excepción en el caso que la 
	 * partida (y/o campeonato) no existan
	 */
	public void startGame(String championShipId, String gameId) throws EIException;
	
	/**
	 * método que proporciona las fichas que se han asignado en una partida a un jugador
	 * @param championShipId identificador del campeonato
	 * @param gameId identificador de la partida
	 * @param playerId identificador del jugador
	 * @return retorna la lista de fichas de un jugador
	 * @throws EIException lanza una excepción en el caso que
	 * un campeonato, partida o jugador no exista o no existan fichas.
	 */
	public Iterador<Card> cards(String championShipId, String gameId, String playerId) throws EIException;
	

	/**
	 * método que proporcina las fichas que se han asignado a una partida
	 * @param championShipId identificador del campeonato
	 * @param gameId identificador de la partida
	 * @return retorna la lista de fichas de una partida
	 * @throws EIException lanza una excepción en el caso 
	 * que un campeonato o partida no exista o no hayan fichas.
	 */
	public Iterador<Card> cardsGame(String championShipId, String gameId) throws EIException;
	
}
